home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Atari Compendium
/
The Atari Compendium (Toad Computers) (1994).iso
/
files
/
umich
/
music
/
eked-m1.zoo
/
src
/
effect.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-02-19
|
6KB
|
203 lines
/*
* EKED-M1 : Editor for Korg M1 synth; effect.c : effect parameter management
* Copyright (C) 1995 Steven M. Eker (Steven.Eker@brunel.ac.uk)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <stddef.h>
#include <string.h>
#include <gemfast.h>
#include <aesbind.h>
#include "gm/gem_man.h"
#include "eked-m1.h"
#include "defs.h"
#include "types.h"
#include "externs.h"
static int epn_table[] =
{
-1, 0, -1, 4,
-1, 1, -1, 5,
-1, 2, -1, 6,
-1, 3, -1, 7
};
static int eob_table[] =
{
0, 4, 8, 12,
2, 6, 10, 14
};
static void effect_update(OBJECT *object, int value);
static void epara_default(int unit, BYTE *data);
static void epara_fixup(OBJECT *tree, int unit, BYTE *data);
void eroute_edit(int handle, OBJECT *tree, int base_page, int m_x, int m_y,
BYTE data[])
{
int ob = objc_find(tree, 0, MAX_DEPTH, m_x, m_y);
switch(ob){
case ER_EFFECT1:
para_edit(handle, tree, ob, BIT0, base_page, 13, data + 8);
data[8] = REPLACE_BIT(data[8], 1, EXTRACT_BIT(data[8], 0));
break;
case ER_EFFECT2:
para_edit(handle, tree, ob, BIT2, base_page + 2, 13, data + 8);
data[8] = REPLACE_BIT(data[8], 3, EXTRACT_BIT(data[8], 2));
break;
case ER_MODE:
para_edit(handle, tree, ob, ROUT, base_page + 4, 8, data + 8);
break;
case ER_PAN3:
para_edit(handle, tree, ob, PAN, base_page + 4, 12, data + 6);
break;
case ER_PAN4:
para_edit(handle, tree, ob, PAN, base_page + 4, 14, data + 7);
break;
}
}
void eroute_setup(OBJECT *tree, BYTE data[])
{
para_fill(tree + ER_EFFECT1, BIT0, data + 8);
para_fill(tree + ER_EFFECT2, BIT2, data + 8);
para_fill(tree + ER_MODE, ROUT, data + 8);
para_fill(tree + ER_PAN3, PAN, data + 6);
para_fill(tree + ER_PAN4, PAN, data + 7);
}
void effect_edit(int handle, OBJECT *tree, int unit, int base_page,
int m_x, int m_y, BYTE data[])
{
int ob = objc_find(tree, 0, MAX_DEPTH, m_x, m_y);
int e_type = data[unit];
int new, p_nr, i, offset;
if(ob == EFFECT_TYPE){
new = wm_roll(handle, tree, ob, e_type, 0, 33, &effect_update);
if(new != e_type){
data[unit] = new;
tx_para_chg(base_page + 2 * unit, 8, new);
epara_default(unit, data); /* data array to defaults */
epara_fixup(tree, unit, data); /* update resource tree */
wm_ob_update(handle, tree, E_PARA_BLOCK); /* redraw parameter block */
}
return;
}
p_nr = ob - (E_PARA_BLOCK + 1); /* extract parameter number 0..7 */
if(p_nr < 0 || p_nr > 15 || (p_nr = epn_table[p_nr]) < 0)
return;
i = effect_table[e_type].param[p_nr].data_pos;
switch(i){
case SBAL:
case LBAL:
offset = 2 + 2 * unit;
break;
case RBAL:
offset = 3 + 2 * unit;
break;
default:
offset = i + 9 + 8 * unit;
}
para_edit(handle, tree, ob, effect_table[e_type].param[p_nr].type,
base_page + 1 + 2 * unit, p_nr + 8, data + offset);
if(i == SBAL)
data[offset + 1] = data[offset];
}
static void epara_default(int unit, BYTE *data)
{
int e_type = data[unit];
EPARAMETER *p = effect_table[e_type].param;
PARA_TYPE t;
int i, j, offset;
for(j = 0; j <= 7; j++){
t = p[j].type;
if(t != NPRM){
i = p[j].data_pos;
switch(i){
case SBAL:
case LBAL:
offset = 2 + 2 * unit;
break;
case RBAL:
offset = 3 + 2 * unit;
break;
default:
offset = i + 9 + 8 * unit;
}
data[offset] = p[j].def_val;
if(i == SBAL)
data[offset + 1] = data[offset];
else if(t == DEL4)
data[offset + 1] = p[j].def_val >> 8;
}
}
if(e_type + 1 == 31) /* Delay/Flanger needs flanger waveform selected */
data[6 + 9 + 8 * unit] = 4;
}
static void epara_fixup(OBJECT *tree, int unit, BYTE *data)
{
EPARAMETER *p = effect_table[data[unit]].param;
int i, j, k;
PARA_TYPE t;
char *s;
tree += E_PARA_BLOCK + 1;
for(j = 0; j <= 7; j++){
k = eob_table[j];
t = p[j].type;
if(t == NPRM){
tree[k].ob_flags |= HIDETREE;
tree[k + 1].ob_flags |= HIDETREE;
}
else{
i = p[j].data_pos;
switch(i){
case SBAL:
case LBAL:
i = 2 + 2 * unit;
break;
case RBAL:
i = 3 + 2 * unit;
break;
default:
i += 9 + 8 * unit;
}
tree[k].ob_flags &= ~HIDETREE;
strcpy(STRING_PTR(tree, k), p[j].name);
tree[k + 1].ob_flags &= ~HIDETREE;
s = TEXT_PTR(tree, k + 1);
s[0] = s[1] = s[2] = s[3] = s[4] = ' ';
para_fill(tree + k + 1, t, data + i);
}
}
}
void epara_setup(OBJECT *tree, int unit, BYTE data[])
{
effect_update(tree + EFFECT_TYPE, (int) data[unit]);
epara_fixup(tree, unit, data);
}
static void effect_update(OBJECT *object, int value)
{
(void) strcpy(TEXT_PTR(object, 0), effect_table[value].name);
}